package com.itcam.phaseii.innerclass;

/**
 * 演示局部内部类的使用
 */

public class LocalInnerClass {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.m();
        System.out.println("outer的hashcode=" + outer);
    }
}

class Outer { // 外部类
    private int n1 = 100;

    public void mm() {
        System.out.println("Outer mm()");
    }

    class Inner01 { // 内部类

    }

    public void m() { //方法
        // 局部内部类是定义在外部类的局部位置，通常在方法里
        // 作用域: 仅仅在定义它的方法或代码块中
        class Inner02 { // 局部内部类（本质仍然是一个类）
            // 可以直接访问外部类的所有成员，包含私有的
            public void f() {
                System.out.println("n1 = " + n1);
                // 局部内部类可以直接访问外部类的成员
                mm();
            }

        }
        // 局部内部类不能添加访问修饰符,但是可以使用final修饰
//        public class Inner03 { // Error
//        }
        final class Inner04 {
        }

        // 外部类在方法中，可以创建Inner02对象，然后调用方法即可
        Inner02 inner02 = new Inner02();
        inner02.f();

        /**
         * 记住：
         * 1.局部内部类定义在方法中
         * 2.作用域在方法体或者代码块中
         * 3.本质仍然是一个类
         */


        class Inner05 {
            private int n1 = 800;

            // 如果外部类和局部内部类的成员重名时，默认遵循就近原则，如果想访问外部类的成员，
            // 使用外部类名.this.成员）去访问
            public void ff() {
                System.out.println("n1 = " + n1 + "\n外部类的n1 = " + Outer.this.n1);
                System.out.println("Outer.this hashcode=" + Outer.this);
                mm();
            }

        }

        Inner05 inner05 = new Inner05();
        inner05.ff();

    }

}
